home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 1 / Meeting Pearls Vol 1 (1994).iso / installed_progs / gfx / pbm / source / netpbm-01mar94.patches.lha / ppm / ppmgrad.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-20  |  3.5 KB  |  113 lines

  1. /* ppmgrad.c - create a pixmap of a specified size and gradient.  Stolen from
  2.                ppmmake.c.
  3. **
  4. ** Copyright (C) 1991 by Jef Poskanzer.
  5. ** Copyright (C) 1994 by Gerald Combs.
  6. **
  7. ** Permission to use, copy, modify, and distribute this software and its
  8. ** documentation for any purpose and without fee is hereby granted, provided
  9. ** that the above copyright notice appear in all copies and that both that
  10. ** copyright notice and this permission notice appear in supporting
  11. ** documentation.  This software is provided "as is" without express or
  12. ** implied warranty.
  13. */
  14.  
  15. #include "ppm.h"
  16. #include <math.h>
  17.  
  18. int
  19. main( argc, argv )
  20.     int argc;
  21.     char* argv[];
  22.     {
  23.     pixel color, grads[10];
  24.     pixel* pixrow;
  25.     register pixel* pP;
  26.     int argn, argb, dosin = 0, rows, cols, row, zone, zone_u, zone_l;
  27.     int num_u, num_l, denom;
  28.     register int col;
  29.     char* usage = "width height color1 ... <color10>";
  30.     float fmul;
  31.  
  32.  
  33.     ppm_init( &argc, argv );
  34.  
  35.     if ( argc > 1 )
  36.         if ( strcmp( argv[1], "-sin" ) == 0 )
  37.             ++dosin;
  38.  
  39.     if ( ( argc < ( 4 + dosin ) ) || ( argc > ( 13 + dosin ) ) )
  40.         pm_usage( usage );
  41.  
  42.     argb = dosin + 1;
  43.     if ( sscanf( argv[argb], "%d", &cols ) != 1 )
  44.     pm_usage( usage );
  45.     ++argb;
  46.     if ( sscanf( argv[argb], "%d", &rows ) != 1 )
  47.     pm_usage( usage );
  48.     ++argb;
  49.     for ( argn = argb; argn < argc; ++argn )
  50.         grads[argn - argb] = ppm_parsecolor( argv[argn], PPM_MAXMAXVAL );
  51.     ++argb;
  52.     argn -= argb;
  53.  
  54.     ppm_writeppminit( stdout, cols, rows, PPM_MAXMAXVAL, 0 );
  55.     pixrow = ppm_allocrow( cols );
  56.  
  57.     if ( argn == 0 )
  58.         {
  59.         color.r = grads[0].r;
  60.         color.g = grads[0].g;
  61.         color.b = grads[0].b;
  62.         for ( row = 0; row < rows; ++row )
  63.         {
  64.             for ( col = 0, pP = pixrow; col < cols; ++col, ++pP )
  65.             *pP = color;
  66.             ppm_writeppmrow( stdout, pixrow, cols, PPM_MAXMAXVAL, 0 );
  67.         }
  68.         }
  69.     else
  70.         {
  71.         --rows;
  72.         for ( zone = 1; zone <= argn; ++zone )
  73.             {
  74.             zone_l = ( (zone - 1) * rows ) / argn;
  75.             zone_u = ( zone * rows ) / argn;
  76.             denom = zone_u - zone_l;
  77.             for ( row = zone_l; row < zone_u; ++row )
  78.                 {
  79.                 if ( dosin == 0 )
  80.                     {
  81.                     num_u = zone_u - row;
  82.                     num_l = row - zone_l;
  83.                     }
  84.                 else
  85.                     {
  86.                     fmul = (cos ( (float) (row - zone_l) * 3.1415 /
  87.                            (float) (zone_u - zone_l) ) + 1.0 ) / 2.0;
  88.                     num_u = (int) ( ( fmul * (float) denom ) + 0.5 );
  89.                     num_l = (int) ( ( ( 1 - fmul ) * (float) denom ) + 0.5 );
  90.                     }
  91.                 color.r = ( grads[zone - 1].r * num_u + grads[zone].r *
  92.                             num_l ) / denom;
  93.                 color.g = ( grads[zone - 1].g * num_u + grads[zone].g *
  94.                             num_l ) / denom;
  95.                 color.b = ( grads[zone - 1].b * num_u + grads[zone].b *
  96.                             num_l ) / denom;
  97.                 for (col = 0, pP = pixrow; col < cols; ++col, ++pP )
  98.                     *pP = color;
  99.                 ppm_writeppmrow( stdout, pixrow, cols, PPM_MAXMAXVAL, 0 );
  100.                 }
  101.             }
  102.         color.r = grads[argn].r;
  103.         color.g = grads[argn].g;
  104.         color.b = grads[argn].b;
  105.         for (col = 0, pP = pixrow; col < cols; ++col, ++pP )
  106.             *pP = color;
  107.         ppm_writeppmrow( stdout, pixrow, cols, PPM_MAXMAXVAL, 0 );
  108.         }
  109.  
  110.     pm_close( stdout );
  111.     exit( 0 );
  112.     }
  113.